--
-- Correccion de la funcion que parsea los mensajes de error de OLEExceptions
--

CREATE OR REPLACE FUNCTION soporte.esquema_get_mensaje_error_app(
	text)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE
AS $BODY$
DECLARE
	txt_msg_original 				ALIAS FOR $1;
	txt_msg_error   				TEXT;
	nombre_constraint			TEXT;
	mi_msg_error 		        	TEXT;
	cola_txt 		        			TEXT;
	pos_txt                                           INTEGER;
BEGIN
-- Dado un mensaje de error desde postgres, la aplicacion llama a esta funcion con el texto del mensaje.
-- Parsea el mensaje y recupera el nombre del constraint.
-- Con ese constraint.
-- Accede a la tabla amberrores. Si lo encuentra devuelve el error indicado en esa tabla.
-- Si no, llama a la funcion 'esquema_get_mensaje_error_de_constraint(text)'.


txt_msg_error := LOWER(txt_msg_original);
-- Cambie la forma de llegar el nombre de la constraint..
--
IF (position('gestion_ai' in txt_msg_error) > 0) AND (position('»' in txt_msg_error) > 0) THEN 
		nombre_constraint := substring(txt_msg_error, position('gestion_ai' in lower(txt_msg_error)), 1000);
		nombre_constraint := substring(nombre_constraint, 1, position('»' in nombre_constraint) - 1);	
ELSE
	pos_txt := INDEX(txt_msg_error, 'constraint');
	nombre_constraint := NULL;
	mi_msg_error := NULL;
	IF (pos_txt > 0) THEN
		cola_txt := SUBSTRING(txt_msg_error, pos_txt, 10000);				-- Copiar desde 'constraint'
		cola_txt := SUBSTRING(cola_txt, INDEX(cola_txt, chr(34))+1, 10000);			-- Sacar la primer comilla 
		pos_txt := INDEX(cola_txt, chr(187));
		IF (pos_txt > 0) THEN
			nombre_constraint := SUBSTRING(cola_txt, 1,  pos_txt - 1);			-- Copiar hasta la siguiente comilla
		END IF;
	END IF;
END IF;
IF nombre_constraint IS NOT NULL THEN
	mi_msg_error:= (SELECT mensaje FROM amberrores WHERE lower(nombrerest) = nombre_constraint LIMIT 1);
	IF mi_msg_error IS NULL THEN
		mi_msg_error:= soporte.esquema_get_mensaje_error_de_constraint(nombre_constraint);
	END IF;
END IF;
-- EL TEXTO SIGUIENTE INTENTA MALAMENTE REPLICAR LO QUE HABIA EN LA APP DELPHI.
IF mi_msg_error IS NULL THEN
mi_msg_error:= 
CASE WHEN INDEX(txt_msg_error, '-null') > 0 THEN 'Falta definir un valor obligatorio.'
WHEN INDEX(txt_msg_error, 'duplicate') > 0 AND INDEX(txt_msg_error, 'secondary') > 0 AND INDEX(txt_msg_error, 'key') > 0 THEN 'Clave secundaria repetida.'
WHEN INDEX(txt_msg_error, 'duplicate') > 0 AND  INDEX(txt_msg_error, 'key') > 0 THEN 'Clave primaria repetida.'
ELSE NULL
END;
END IF;
-- En caso de no tener msg_error devolver el mensaje original
/* NOTA: la app muestra el msg_error como mensaje en la ventana de error y como  detalle  el mensaje original */     
RETURN COALESCE(mi_msg_error, txt_msg_original);
END;
$BODY$;

ALTER FUNCTION soporte.esquema_get_mensaje_error_app(text)
    OWNER TO abacouser;
    
    
--
SELECT aaversion('518.07','518.06');
--
